package com.cershy.linyuminiserver.utils;

import cn.hutool.core.io.FileTypeUtil;
import com.google.common.collect.Lists;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.List;

/**
 * @author wangbao
 */
@Slf4j
public class HttpFileUploadUtils {

    /**
     * 文件上传
     *
     * @param file     源文件
     * @param dest     目标地址
     * @param fileName 文件名
     * @throws IOException
     */
    public static void httpUpload(MultipartFile file, String dest, String fileName) throws IOException {
        File destination = new File(dest, fileName);
        if (!destination.exists()) {
            if (!destination.getParentFile().exists()) {
                destination.getParentFile().mkdirs();
            }
            destination.createNewFile();
        }
        System.out.println("==============");
        System.out.println(dest+fileName);
        FileUtils.copyInputStreamToFile(file.getInputStream(), destination);
    }

    /**
     * 字节文件上传
     *
     * @param dest     目标地址
     * @param fileName 文件名
     * @param bytes    文件字节
     * @throws IOException
     */
    public static void bytesUpload(String dest, String fileName, byte[] bytes) throws IOException {
        File destination = new File(dest, fileName);
        if (!destination.exists()) {
            if (!destination.getParentFile().exists()) {
                destination.getParentFile().mkdirs();
            }
            destination.createNewFile();
        }
        FileUtils.writeByteArrayToFile(destination, bytes);
    }

    /**
     * 校验上传的图片类型
     * 
     * @param file
     * @param allowImageTypes
     * @throws Exception
     */
	public static void checkUploadImageType(MultipartFile file, String allowImageTypes) throws Exception {
		// 文件头文件类型
		String headerType = FileTypeUtil.getType(file.getInputStream());

		List<String> checkFileTypes = Lists.newArrayList(allowImageTypes.split(","));
		if (!checkFileTypes.contains(headerType)) {
			log.warn("上传图片格式错误，目前只支持上传" + allowImageTypes + "格式图片");
			throw new RuntimeException("上传图片格式错误，目前只支持上传" + allowImageTypes + "格式图片");
		}

		// 后缀名文件类型
		String filename = file.getOriginalFilename();
		String suffixType = StringUtils.substringAfterLast(filename, ".").toLowerCase();
		if ("jpeg".equals(suffixType)) {
			suffixType = "jpg";
		}

		// 文件头与文件名后缀不匹配
		if (!StringUtils.equalsIgnoreCase(suffixType, headerType)) {
			log.warn("上传文件后缀类型为" + suffixType + "，真实文件类型为" + headerType + "，不匹配");
			throw new RuntimeException("上传文件后缀类型为" + suffixType + "，真实文件类型为" + headerType + "，不匹配");
		}
	}
}